package com.itheima.controller.v1;

import com.itheima.common.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * 合同的上传和下载
 */
@RestController
@RequestMapping("/common")
@CrossOrigin
public class UploadController {

    @Value("${pdfDir.name}")
    private String url;

    /**
     * 1.文件上传 注意点:
     *      接收数据类型必须是MultipartFile 代表上传的文件
     *      上传参数的名字 必须和前端表单的name属性名一致
     *      todo 和前端确认表单的name属性名
     */

    //上传合同--上传合同的PDF
    @PostMapping("/upload")
    public R upload(MultipartFile file) throws IOException {
        //1.文件重新命名(必须唯一) 使用UUID或者雪花
        String newFileName = UUID.randomUUID().toString();
        //2.获取图片的后缀名
        //2.1获取原来的文件名
        String oldFileName = file.getOriginalFilename();
        //2.2切割获取原来的文件名的后缀
        String hzName = oldFileName.substring(oldFileName.lastIndexOf("."));
        newFileName = newFileName + hzName;
        //springmvc提供的存储方法(内部依然使用的字节流)
        file.transferTo(new File(url + newFileName));
        return new R(1,"",newFileName);
    }

    @Autowired
    private HttpServletResponse response;

    //合同的预览-
    @GetMapping("/download")
    public void download(String name) throws IOException {
        //1.找到文件并且读取文件
        //1.1找到文件,获取字节输入流
        FileInputStream fis = new FileInputStream(url + name);
        //2.获取网络输出流,将读取的文件响应回前端
        ServletOutputStream os = response.getOutputStream();
        //1.2读取文件
        byte[] bytes = new byte[1024];
        while (true){
            int len = fis.read(bytes);
            if (len == -1){ //图片读取完毕
                break;
            }
            //3.写给前端用户,返回文件给前端
            os.write(bytes,0,len);
        }
        //关闭流
        os.close();
        fis.close();
    }
}
